home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_gsl.idb / usr / freeware / include / gsl_rng.h.z / gsl_rng.h
Encoding:
C/C++ Source or Header  |  1999-07-16  |  4.4 KB  |  155 lines

  1. #ifndef GSL_RNG_H
  2. #define GSL_RNG_H
  3. #include <stdlib.h>
  4. #include <gsl_errno.h>
  5.  
  6. typedef struct
  7.   {
  8.     const char *name;
  9.     unsigned long int max;
  10.     unsigned long int min;
  11.     size_t size;
  12.     void *state;
  13.     void (*set) (void *state, unsigned long int seed);
  14.     unsigned long int (*get) (void *state);
  15.     double (*get_double) (void *state);
  16.   }
  17. gsl_rng;
  18.  
  19. typedef struct
  20.   {
  21.     const char *name;
  22.     unsigned long int max;
  23.     unsigned long int min;
  24.     size_t size;
  25.     void (*set) (void *state, unsigned long int seed);
  26.     unsigned long int (*get) (void *state);
  27.     double (*get_double) (void *state);
  28.   }
  29. gsl_rng_type;
  30.  
  31. /* These structs also need to appear in default.c so you can select
  32.    them via the environment variable GSL_RNG_TYPE */
  33.  
  34. extern const gsl_rng_type *gsl_rng_slatec;
  35. extern const gsl_rng_type *gsl_rng_cmrg;
  36. extern const gsl_rng_type *gsl_rng_gfsr4;
  37. extern const gsl_rng_type *gsl_rng_minstd;
  38. extern const gsl_rng_type *gsl_rng_mrg;
  39. extern const gsl_rng_type *gsl_rng_mt19937;
  40. extern const gsl_rng_type *gsl_rng_r250;
  41. extern const gsl_rng_type *gsl_rng_ran0;
  42. extern const gsl_rng_type *gsl_rng_ran1;
  43. extern const gsl_rng_type *gsl_rng_ran2;
  44. extern const gsl_rng_type *gsl_rng_ran3;
  45. extern const gsl_rng_type *gsl_rng_rand48;
  46. extern const gsl_rng_type *gsl_rng_rand;
  47. extern const gsl_rng_type *gsl_rng_random8_bsd;
  48. extern const gsl_rng_type *gsl_rng_random8_glibc2;
  49. extern const gsl_rng_type *gsl_rng_random8_libc5;
  50. extern const gsl_rng_type *gsl_rng_random128_bsd;
  51. extern const gsl_rng_type *gsl_rng_random128_glibc2;
  52. extern const gsl_rng_type *gsl_rng_random128_libc5;
  53. extern const gsl_rng_type *gsl_rng_random256_bsd;
  54. extern const gsl_rng_type *gsl_rng_random256_glibc2;
  55. extern const gsl_rng_type *gsl_rng_random256_libc5;
  56. extern const gsl_rng_type *gsl_rng_random32_bsd;
  57. extern const gsl_rng_type *gsl_rng_random32_glibc2;
  58. extern const gsl_rng_type *gsl_rng_random32_libc5;
  59. extern const gsl_rng_type *gsl_rng_random64_bsd;
  60. extern const gsl_rng_type *gsl_rng_random64_glibc2;
  61. extern const gsl_rng_type *gsl_rng_random64_libc5;
  62. extern const gsl_rng_type *gsl_rng_random_bsd;
  63. extern const gsl_rng_type *gsl_rng_random_glibc2;
  64. extern const gsl_rng_type *gsl_rng_random_libc5;
  65. extern const gsl_rng_type *gsl_rng_randu;
  66. extern const gsl_rng_type *gsl_rng_ranf;
  67. extern const gsl_rng_type *gsl_rng_ranlux389;
  68. extern const gsl_rng_type *gsl_rng_ranlux;
  69. extern const gsl_rng_type *gsl_rng_ranmar;
  70. extern const gsl_rng_type *gsl_rng_taus;
  71. extern const gsl_rng_type *gsl_rng_transputer;
  72. extern const gsl_rng_type *gsl_rng_tt800;
  73. extern const gsl_rng_type *gsl_rng_uni32;
  74. extern const gsl_rng_type *gsl_rng_uni;
  75. extern const gsl_rng_type *gsl_rng_vax;
  76. extern const gsl_rng_type *gsl_rng_zuf;
  77.  
  78. extern const gsl_rng_type *gsl_rng_default;
  79. extern unsigned long int gsl_rng_default_seed;
  80.  
  81. unsigned long int gsl_rng_get (const gsl_rng * r);
  82. double gsl_rng_uniform (const gsl_rng * r);
  83. double gsl_rng_uniform_pos (const gsl_rng * r);
  84. unsigned long int gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n);
  85.  
  86. gsl_rng *gsl_rng_alloc (const gsl_rng_type * T);
  87. gsl_rng *gsl_rng_cpy (gsl_rng * dest, const gsl_rng * src);
  88. gsl_rng *gsl_rng_clone (const gsl_rng * r);
  89.  
  90. void gsl_rng_free (gsl_rng * r);
  91.  
  92. void gsl_rng_set (const gsl_rng * r, unsigned long int seed);
  93. unsigned long int gsl_rng_max (const gsl_rng * r);
  94. unsigned long int gsl_rng_min (const gsl_rng * r);
  95. const char *gsl_rng_name (const gsl_rng * r);
  96. size_t gsl_rng_size (const gsl_rng * r);
  97. void * gsl_rng_state (const gsl_rng * r);
  98.  
  99. void gsl_rng_print_state (const gsl_rng * r);
  100.  
  101. const gsl_rng_type * gsl_rng_env_setup (void);
  102.  
  103. #ifdef HAVE_INLINE
  104. inline unsigned long int
  105. gsl_rng_get (const gsl_rng * r)
  106. {
  107.   return (r->get) (r->state);
  108. }
  109.  
  110. inline double
  111. gsl_rng_uniform (const gsl_rng * r)
  112. {
  113.   return (r->get_double) (r->state);
  114. }
  115.  
  116. inline double
  117. gsl_rng_uniform_pos (const gsl_rng * r)
  118. {
  119.   double x ;
  120.   do
  121.     {
  122.       x = (r->get_double) (r->state) ;
  123.     }
  124.   while (x == 0) ;
  125.  
  126.   return x ;
  127. }
  128.  
  129. inline unsigned long int
  130. gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)
  131. {
  132.   unsigned long int offset = r->min;
  133.   unsigned long int range = r->max - offset;
  134.   unsigned long int scale = range / n;
  135.   unsigned long int k;
  136.  
  137.   if (n > range) 
  138.     {
  139.       GSL_ERROR_RETURN ("n exceeds maximum value of generator",
  140.             GSL_EINVAL, 0) ;
  141.     }
  142.  
  143.   do
  144.     {
  145.       k = (((r->get) (r->state)) - offset) / scale;
  146.     }
  147.   while (k >= n);
  148.  
  149.   return k;
  150. }
  151.  
  152. #endif /* HAVE_INLINE */
  153.  
  154. #endif /* GSL_RNG_H */
  155.